/*******************************************************************************
* Copyright (c) 2009, 2012 EclipseSource and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* EclipseSource - initial API and implementation
******************************************************************************/
package org.eclipse.rap.ui.interactiondesign.internal;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.rap.ui.interactiondesign.ConfigurableStack;
import org.eclipse.rap.ui.internal.branding.BrandingUtil;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.internal.presentations.NativeStackPresentation;
import org.eclipse.ui.internal.presentations.PresentablePart;
import org.eclipse.ui.presentations.IPartMenu;
import org.eclipse.ui.presentations.IPresentablePart;
import org.eclipse.ui.presentations.IPresentationSerializer;
import org.eclipse.ui.presentations.IStackPresentationSite;
import org.eclipse.ui.presentations.StackDropResult;
import org.eclipse.ui.presentations.StackPresentation;
/**
* This is the proxy object for <code>ConfigurableStack</code>. The <code>
* PresentationFactory</code> creates proxies instead of real <code>
* ConfigurableStack</code>s to be able to switch the presentation on the fly.
*
* @since 1.2
*/
public class ConfigurableStackProxy extends StackPresentation {
public static final String STACK_PRESENTATION_ID = "stackPresentationId";
private IConfigurationElement brandingElement;
private String currentId;
private StackPresentation currentStackPresentation;
private NativeStackPresentation nativeStackPresentation;
private Composite parent;
private boolean showTitle = false;
private IStackPresentationSite site;
private String type;
public ConfigurableStackProxy(
final Composite parent,
final IStackPresentationSite stackSite,
final String type )
{
super( stackSite );
this.parent = parent;
this.site = stackSite;
this.type = type;
currentId = "";
nativeStackPresentation = new NativeStackPresentation( parent, stackSite );
currentStackPresentation
= loadStackPresentations( this.type, this.site, this.parent );
if( currentStackPresentation == null ) {
currentStackPresentation = nativeStackPresentation;
}
}
public void addPart( final IPresentablePart newPart, final Object cookie ) {
StackPresentation delegate = getDelegate();
if( delegate instanceof ConfigurableStack ) {
IAdaptable adaptable = getConfigAdaptable();
if( newPart instanceof PresentablePart ) {
PresentablePart part = ( PresentablePart ) newPart;
part.setConfigurationAdaptable( adaptable );
}
}
delegate.addPart( newPart, cookie );
}
private boolean brandingPresentationFactoryExists() {
boolean result = false;
String id = getBrandingPresentationFactoryId();
if( id != null ) {
result = true;
}
return result;
}
/**
* @see StackPresentation
*/
public Point computeMinimumSize() {
return getDelegate().computeMinimumSize();
}
public int computePreferredSize( boolean width,
int availableParallel,
int availablePerpendicular,
int preferredResult )
{
return getDelegate().computePreferredSize( width,
availableParallel,
availablePerpendicular,
preferredResult );
}
private ConfigurableStack createStackById( final String stackId ) {
ConfigurableStack result = null;
IExtensionRegistry registry = Platform.getExtensionRegistry();
String stackPresentationExtId = ConfigurableStack.STACK_PRESENTATION_EXT_ID;
IExtensionPoint point = registry.getExtensionPoint( stackPresentationExtId );
if( point != null ) {
IConfigurationElement[] elements = point.getConfigurationElements();
boolean found = false;
for( int i = 0; i < elements.length && !found; i++ ) {
String id = elements[ i ].getAttribute( "id" );
//String presentationType = elements[ i ].getAttribute( "type" );
if( id.equals( stackId ) ) {
found = true;
try {
Object obj = elements[ i ].createExecutableExtension( "class" );
result = ( ConfigurableStack ) obj;
result.init( site, id, parent, this );
} catch( CoreException e ) {
// nothing todo
}
}
}
}
return result;
}
/**
* @see StackPresentation
*/
public void dispose() {
getDelegate().dispose();
}
private IConfigurationElement getBrandingElement() {
if( brandingElement == null ) {
String brandingId = BrandingUtil.getCurrentBrandingId();
if( brandingId != null ) {
IExtensionRegistry registry = Platform.getExtensionRegistry();
String id = "org.eclipse.rap.ui.branding";
IExtensionPoint brandingPoint = registry.getExtensionPoint( id );
if( brandingPoint != null ) {
IConfigurationElement[] elements
= brandingPoint.getConfigurationElements();
boolean found = false;
for( int i = 0; i < elements.length && !found; i++ ) {
String tempId = elements[ i ].getAttribute( "id" );
if( tempId.equals( brandingId ) ) {
found = true;
brandingElement = elements[ i ];
}
}
}
}
}
return brandingElement;
}
// Delegate methods
private String getBrandingPresentationFactoryId() {
return loadBrandingPresentationFactoryId( getBrandingElement() );
}
private IAdaptable getConfigAdaptable() {
IAdaptable adaptable = new IAdaptable() {
public Object getAdapter( Class adapter ) {
Object result = null;
if( currentStackPresentation instanceof ConfigurableStack ) {
ConfigurableStack stackPresentation
= ( ConfigurableStack ) currentStackPresentation;
if( adapter == ToolBar.class ) {
result = stackPresentation.createPartToolBar( );
} else if( adapter == IPartMenu.class ) {
result = stackPresentation.createViewMenu();
}
}
return result;
}
};
return adaptable;
}
/**
* @see StackPresentation
*/
public Control getControl() {
return getDelegate().getControl();
}
public ConfigurableStack getCurrentStackPresentation() {
ConfigurableStack result = null;
if( currentStackPresentation instanceof ConfigurableStack ) {
result = ( ConfigurableStack ) currentStackPresentation;
}
return result;
}
private StackPresentation getDelegate() {
StackPresentation result;
if( currentStackPresentation != null ) {
result = currentStackPresentation;
} else {
result = nativeStackPresentation;
}
return result;
}
/**
* @see StackPresentation
*/
public boolean getShowTitle() {
return showTitle;
}
/**
* @see StackPresentation
*/
public int getSizeFlags( final boolean width ) {
return getDelegate().getSizeFlags( width );
}
/**
* @see StackPresentation
*/
public Control[] getTabList( final IPresentablePart part ) {
return getDelegate().getTabList( part );
}
/**
* Returns the type of the Stack.
* @return the type. See <code>PresentationFactory</code> constants.
*/
public String getType() {
return type;
}
private String loadBrandingPresentationFactoryId(
final IConfigurationElement element )
{
String result = null;
if( element != null ) {
IConfigurationElement[] factory
= element.getChildren( "presentationFactory" );
if( factory.length > 0 ) {
result = factory[ 0 ].getAttribute( "id" );
}
}
return result;
}
private ConfigurableStack loadDefaultPartStack() {
ConfigurableStack result = null;
IConfigurationElement element = getBrandingElement();
IConfigurationElement[] factory
= element.getChildren( "presentationFactory" );
if( factory.length > 0 ) {
IConfigurationElement[] stacks
= factory[ 0 ].getChildren( "defaultStackPresentation" );
if( stacks.length > 0 ) {
String id = stacks[ 0 ].getAttribute( "id" );
result = createStackById( id );
}
}
return result;
}
private ConfigurableStack loadLayoutPartStack() {
ConfigurableStack result = null;
IConfigurationElement element = getBrandingElement();
IConfigurationElement[] factory
= element.getChildren( "presentationFactory" );
if( factory.length > 0 ) {
IConfigurationElement[] stacks
= factory[ 0 ].getChildren( "stackPresentation" );
if( stacks.length > 0 ) {
String layoutPartId = ConfigurableStack.getLayoutPartId( site );
boolean found = false;
for( int i = 0; i < stacks.length && !found; i++ ) {
String partId = stacks[ i ].getAttribute( "partId" );
if( partId.equals( layoutPartId ) ) {
String stackId = stacks[ i ].getAttribute( "id" );
result = createStackById( stackId );
found = true;
}
}
}
}
return result;
}
private ConfigurableStack loadStackFromBranding() {
ConfigurableStack result = loadLayoutPartStack();
if( result == null ) {
result = loadDefaultPartStack();
}
return result;
}
/*
* load the saved or default StackPresentation from extension registry
*/
private ConfigurableStack loadStackPresentations(
final String type,
final IStackPresentationSite site,
final Composite parent )
{
this.parent = parent;
ConfigurableStack result = null;
IExtensionRegistry registry = Platform.getExtensionRegistry();
String stackPresentationExtId = ConfigurableStack.STACK_PRESENTATION_EXT_ID;
IExtensionPoint point = registry.getExtensionPoint( stackPresentationExtId );
if( point != null ) {
IConfigurationElement[] elements = point.getConfigurationElements();
String savedStackId = ConfigurableStack.getSavedStackId( site );
boolean error = false;
boolean found = false;
for( int i = 0; !error && !found && i < elements.length; i++ ) {
String id = elements[ i ].getAttribute( "id" );
String presentationType = elements[ i ].getAttribute( "type" );
if( savedStackId.equals( IPreferenceStore.STRING_DEFAULT_DEFAULT ) ) {
// No id is saved, check branding Presentationfactory
if( brandingPresentationFactoryExists() ) {
ConfigurableStack tempStack = loadStackFromBranding();
if( tempStack != null ) {
result = tempStack;
currentId = id;
} else {
result = null;
}
found = true;
} else {
result = null;
found = true;
}
} else {
// their is a saved id, loading the stackPresentation if the id
// matches the saved id
if( id.equals( savedStackId ) && presentationType.equals( type ) ) {
result = createStackById( id );
currentId = id;
found = true;
}
}
}
}
return result;
}
/**
* @see StackPresentation
*/
public void movePart( final IPresentablePart toMove, final Object cookie ) {
getDelegate().movePart( toMove, cookie );
}
/**
* @see StackPresentation
*/
public void refreshStack() {
if( !currentId.equals( "" ) ) {
setCurrentStackPresentation( currentId );
}
}
/**
* @see StackPresentation
*/
public void removePart( final IPresentablePart oldPart ) {
getDelegate().removePart( oldPart );
}
/**
* @see StackPresentation
*/
public void restoreState(
final IPresentationSerializer context,
final IMemento memento )
{
getDelegate().restoreState( context, memento );
}
/**
* @see StackPresentation
*/
public void saveState(
final IPresentationSerializer context,
final IMemento memento )
{
getDelegate().saveState( context, memento );
}
/**
* @see StackPresentation
*/
public void selectPart( final IPresentablePart toSelect ) {
getDelegate().selectPart( toSelect );
}
public StackDropResult dragOver( final Control currentControl,
final Point location )
{
return null;
}
/**
* @see StackPresentation
*/
public void setActive( final int newState ) {
getDelegate().setActive( newState );
}
/**
* @see StackPresentation
*/
public void setBounds( final Rectangle bounds ) {
getDelegate().setBounds( bounds );
}
public void setCurrentStackPresentation( final String id ) {
IExtensionRegistry registry = Platform.getExtensionRegistry();
String stackPresentationExtId = ConfigurableStack.STACK_PRESENTATION_EXT_ID;
IExtensionPoint point
= registry.getExtensionPoint( stackPresentationExtId );
IConfigurationElement elements[] = point.getConfigurationElements();
Object stackObj = null;
for( int i = 0; stackObj == null && i < elements.length; i++ ) {
String attributeId = elements[ i ].getAttribute( "id" );
if( attributeId.equals( id ) ) {
currentId = id;
try {
Rectangle bounds = currentStackPresentation.getControl().getBounds();
stackObj = elements[ i ].createExecutableExtension( "class" );
if( stackObj instanceof ConfigurableStack ) {
ConfigurableStack newStackPresentation
= ( ConfigurableStack ) stackObj;
newStackPresentation.init( site, id, parent, this );
Control control = currentStackPresentation.getControl();
control.dispose();
IPresentablePart[] parts = site.getPartList();
for( int j = 0; j < parts.length; j++ ) {
newStackPresentation.addPart( parts[ j ], null );
currentStackPresentation.removePart( parts[ j ] );
}
newStackPresentation.selectPart( site.getSelectedPart() );
currentStackPresentation.getControl().dispose();
currentStackPresentation.dispose();
currentStackPresentation = newStackPresentation;
currentStackPresentation.setBounds( bounds );
}
} catch( CoreException e ) {
e.printStackTrace();
}
}
}
}
/**
* @see StackPresentation
*/
public void setShowTitle( boolean showTitle ) {
this.showTitle = showTitle;
}
/**
* @see StackPresentation
*/
public void setState( final int state ) {
getDelegate().setState( state );
}
/**
* @see StackPresentation
*/
public void setVisible( final boolean isVisible ) {
getDelegate().setVisible( isVisible );
}
/**
* @see StackPresentation
*/
public void showPaneMenu() {
getDelegate().showPaneMenu();
}
/**
* @see StackPresentation
*/
public void showPartList() {
getDelegate().showPartList();
}
/**
* @see StackPresentation
*/
public void showSystemMenu() {
getDelegate().showSystemMenu();
}
}